#include "sntp.h"
#include <arpa/inet.h>
#include <stdio.h>

void sntp_proc(char *buf, ssize_t n, struct timeval *nowptr)
{
    int             version, mode;
    uint32_t        nsec, useci;
    double          usecf;
    struct timeval  diff;
    struct ntpdata *ntp;

    if (n < (ssize_t) sizeof(struct ntpdata)) {
        printf("\npacket too small: %ld bytes\n", n);
        return;
    }

    ntp = (struct ntpdata *) buf;
    version = (ntp->status & VERSION_MASK) >> 3;
    mode = ntp->status & MODE_MASK;
    printf("\nv%d, mode %d, strat %d, ", version, mode, ntp->stratum);
    if (mode == MODE_CLIENT) {
        printf("client\n");
        return;
    }

    nsec = ntohl(ntp->xmt.int_part) - JAN_1970;
    useci = ntohl(ntp->xmt.fraction);       // 32-bit integer fraction
    usecf = useci;                          // integer fraction -> double
    usecf /= 4294967296.0;                  // divede by 2**32 -> [0, 1.0]
    useci = usecf * 1000000.0;              // fraction -> parts per million

    diff.tv_sec = nowptr->tv_sec - nsec;
    if ((diff.tv_usec = nowptr->tv_usec - useci) < 0) {
        diff.tv_usec += 1000000;
        diff.tv_sec--;
    }
    useci = (diff.tv_sec * 1000000) + diff.tv_usec; // diff in microsec
    printf("clock difference = %d usec\n", useci);
}
